Coherence proposal · one app, many hobbies · September 2026
The app owns the verbs.
The type owns
the nouns.

Wine is drunk, a computer is serviced, a record is played, a pin is just kept. Each type has asked for something the others don't need — a drinking window, a service clock, a working state, parts inside parts. The risk is obvious: sixteen types become sixteen small apps sharing a tab bar. This page proposes the rules that stop that, and shows one screen rendering five types without changing shape.

Coherence isn't sameness. A cellar and a record shelf should feel different — in their nouns, their scales, their objects on the shelf. They must never feel different in how you add, find, lend, confirm, or read a screen. So: the app fixes the structure and the verbs; a type may only fill slots.
01 · The demonstration
One item screen,
five types, zero new layouts

Every dashed box is a slot. The type fills it or hides it; it never adds a box, moves one, or invents a control. Switch types and watch what changes — and what can't.

{{ t.name }}
9:41
{{ typeLabel }}
HERO · ONE 3D SILHOUETTE PER TYPE
{{ heroLabel }}
SPINE · 2–3 FACTS, TYPE NAMES THEM
{{ title }}
{{ subtitle }}
{{ spineYear }}
STATUS · ONE CHIP, SAME PALETTE
{{ statusName }}
{{ statusKind }}
SIGNATURE · 0–2, BOUND FROM THE KIT
— NONE DECLARED · SLOT COLLAPSES, NEVER MOVES
MATURITY · GAUGE
ESTIMATE
2015
PEAK 2032–41
2050
THE CASE · CONSUMABLE
4 OF 6 LEFT
{{ sigLadderCap }}
{{ sigLadderLeg }}
{{ g.n }}
{{ g.mark }}
POWER-ON PANEL · AUG 2026
FROM LOG
{{ l.n }}
SYSTEM MAP · COMPOSITE
1 + 2 PARTS
A500
{{ p.n }}
FIELDS · KIND DECIDES THE CONTROL
{{ f.k }}
{{ f.v }}
ACTIONS · APP VERBS + AT MOST ONE TYPE VERB
Lend
Move
Edit
{{ typeVerb }}
HISTORY · APPEND-ONLY, SHARED EVENTS + TYPE EVENTS
{{ e.d }}
{{ e.t }}
WHAT CHANGED
{{ changed }}
WHAT COULDN'T
The seven slots, their order, the three app verbs, the tab bar, the row shape in the list behind this screen, the review queue this object came through, the lending handshake it will go out on. None of these know which type they're showing.
THE TYPE VERB
{{ verbNote }}
THE SIGNATURE
{{ sigNote }}
THE STATUS CHIP
Every derived state in the app — maturity, service risk, completeness, a plain grade — is drawn from the same five swatches with the same meaning: fine · good · watch · act · gone. A mixed shelf can therefore sort every type by "needs attention" without knowing what attention means for each.
FINE
GOOD
WATCH
ACT
GONE
THE ESTIMATE LABEL
Any state computed rather than typed carries the mono word ESTIMATE beside it, in every type. One word teaches the whole app's honesty policy once.
02 · The contract
What a type may declare,
and what it may not

Today a type is a YAML manifest. Coherence is mostly a matter of what that manifest is allowed to contain. This is the proposed boundary — the left column is the entire vocabulary a type has; the right column is what it can never touch, no matter how good the reason.

A TYPE MAY DECLARE
+
Spine labels — what title, subtitle and year are called (Album / Artist / Year; Wine / Producer / Vintage; Model / Manufacturer / Built).
+
Fields, each with a kind from the shared kit — number, choice, scale, date, year, yearRange, text, list, log, quantity, composite. Fourteen fields maximum; nine or fewer optional.
+
One condition scale, named and ordered, and optionally up to two further axes on that same scale (sleeve; cart · box · manual; disc · booklet · case). Three axes is the cap — past that it's a table, not a picture.
+
Its bulk rule: individuals, rows, or quantity — and whether quantity is consumable.
+
Type events that append to history (opened, serviced, regraded, played), added to the shared set — never replacing it.
+
One derived status, mapped onto the five shared swatches, and one clock that may notify — opt-in, labelled estimate.
+
One type verb — Open a bottle, Add part, Power-on test. Not two.
+
Zero, one or two signatures — a renderer from the kit (ladder, set, gauge, panel, map, case) bound to one of its own fields. See 03 and 09.
+
Lookup strategy: barcode symbologies, providers, local corpus, OCR fields, identifier patterns.
+
Identity: one accent colour from the app's palette, one 3D silhouette, one noun for the object and one for the collection (bottle / cellar, record / crate, machine / bench).
A TYPE MAY NEVER
—
Add a screen, a tab, a sheet, or a navigation route. If a type needs a screen, it isn't a type — it's a feature, and it's built once for everyone.
—
Reorder or hide the seven item slots, or change the list row's shape. It may leave a slot empty.
—
Draw its own signature. Renderers live in the kit; a type binds one, it never paints one. No custom view code, ever.
—
Rename an app verb. Lend is lend, even for a bottle nobody would lend. Confirm is confirm.
—
Introduce a colour, a font, an icon style, or a status meaning outside the shared five.
—
Invent a field kind. A new kind enters the kit only when a second type asks for it unprompted — the rule that gave us log (wine asked, retro computers confirmed).
—
Send more than one kind of notification, or any by default.
—
Touch money, people, places or sharing. Those are app-level entities; a type can only reference them.
—
Collect personal data in a field (names, addresses, emails). Provenance names a previous owner as text, and stops there.

The test for any proposed type, official or community: can it be written in the manifest with at most one new primitive and zero new screens? Wine passed with yearRange. Retro computers passed with composite. Anything that fails is either two types or a feature.

03 · Signatures
How a type gets a face
without getting a screen

Slots and swatches keep the app coherent; they also risk making a cellar and a crate feel like the same spreadsheet. So a type may declare up to two signatures: a small, opinionated rendering of a field it already owns — the drinking window drawn as a gauge, bottles left drawn as bottles. Not a new control, not new data, not a screen. A noun, drawn bigger.

A signature renders; it never collects. Strip every signature from a type and it loses charm and nothing else — same fields, same CSV, same row, same clock.
Proposed for the launch types
TYPE · SIGNATURE
RENDERS
WHY IT EARNS THE SLOT
Wine · Maturity gauge
yearRange + vintage → gauge
The window is why the type exists. Young / drinking / peak / past as one band with a "now" marker — the chip says drink it, the gauge says how long you've got.
Wine · The case
consumable quantity → case
Bottles left, as bottles. Turns "Open a bottle" from a decrement into a small, visible loss — the emotional core of cellaring.
Vinyl · Grade ladder
scale × 2 → ladder
Media and sleeve on one Goldmine ladder. Two grades read as one object, the way a collector actually says "VG+ / VG".
Retro computer · Power-on panel
log (kind: test) → panel
The last power-on test as four LEDs: power · video · floppy · keys. Working state in the hobby's own idiom; refreshes each time a test is logged.
Retro computer · System map
composite → map
The machine and what hangs off it. Says "+2 parts" as a shape, and makes Add part feel like plugging something in.
Retro game · CIB ladder
scale × 3 → ladder
Cart, box and manual as three markers on one condition ladder whose last step is Missing. One picture answers both questions a game collector asks — how complete, and how nice — and it's the same renderer vinyl uses. See 09.
Thing · none
—
By design. The collapsed signature slot is the quiet nudge toward proposing a real type.
Five rules for signatures
1
Bound to a field, never to new data
A signature reads one field (or two of the same kind) the type already declares. Tapping it opens that field's ordinary control. It has no side effect — that's the type verb's job — and never notifies — that's the clock's.
2
Renderers live in the kit, like kinds
Launch kit: ladder, set, gauge, panel, map, case — six renderers, each built once, and each reading its steps and labels out of the type's own YAML (see 09). A type binds one; a community type may only bind. A new renderer enters the kit under the second-customer rule, with the same one-exception clause.
3
One slot, one place, one height budget
Between status and fields — verdict, then evidence, then detail. At most two, each ≤ 64pt tall. When none is declared the slot collapses; it never moves.
4
Same ink, plus the accent
The signature is part of the object, so the type accent is allowed here — rule 1 of coexistence grows from three places to four. The five swatches keep their meaning inside it; anything derived carries ESTIMATE.
5
Invisible everywhere but the item screen
List row, CSV, share card, widget, notification: none of them see a signature. It's the one place a type is allowed to show off, and the app keeps it there.
04 · Seven rules of coexistence
How the hobbies share
the rest of the app
1
Identity lives in the object, never in the chrome
A cellar looks like a cellar because the shelf shows racks of bottles, not because the navigation turned burgundy. Type accent appears in exactly four places: the collection's 3D object, the type chip, the empty state, and the signature. Everything else is ink on paper.
2
One row shape from a stamp to a Porsche
44px thumb, two or three spine lines, one status chip, one trailing fact. A quantity type shows ×N in the chip; a composite shows +3 parts in the trailing fact; a consumable shows what's left. The row never grows a second line of chips.
3
Six fields every object has, whatever its type
Title, acquired, paid, condition, location, notes. They're what a mixed collection sorts and searches on, what the CSV always contains, and what the generic Thing type is made of. Every type is these six plus its own.
4
Stats group by type and never average across them
The shelf header counts objects. A mixed collection's stats screen is a stack of per-type cards. The one cross-type number allowed is "needs attention", because the five-swatch status makes it honest.
5
The add flow is the same four steps for everything
Capture → propose → confirm → fill. What happens inside "propose" is the type's lookup strategy (Discogs for vinyl, OCR for a wine label, a local corpus for a Commodore), but the user sees the same viewfinder, the same match card, the same review queue.
6
Type vocabulary in the fields, app vocabulary everywhere else
Inside a wine object the words are vintage, producer, appellation, fill level. Around it — buttons, tabs, empty states, notifications — the words are add, lend, confirm, shelf, object. A user who learns the app on records already knows how to use it on bottles.
7
One clock per type, and all clocks tell the same time
Wine's maturity, the machine's service risk, a card's grading-due, a watch's service interval: each type may have one. They all render as the status chip, all carry ESTIMATE, all opt-in, all feed one "needs attention" shelf. The app has one idea of urgency, not sixteen.
05 · The shared kit, as it stands
Eleven kinds, six shared
fields, five swatches
KIND
CONTROL IT GETS
FIRST ASKED BY
ALSO USED BY
number · choice · text
Stepper · chips · field
Everyone
Everyone
scale
The hobby's ordered grading picker
Vinyl (Goldmine)
Comics, coins, cards, computers (cosmetic)
date · year
Picker; year allows NV / circa
Vinyl
Wine (vintage is identity), computers (built week)
yearRange
Two-handle range with a "now" marker
Wine (drinking window)
Pending a second customer — whisky, cigars, film stock would qualify
log
Dated, append-only entries with a kind
Wine (opened bottles)
Retro computers (service log) — the rule proven
quantity
×N with per-copy promotion; consumable flag
Coins, stamps, cards
Wine (consumable)
composite
Add part / detach; system total, one level deep
Retro computers
Cameras, synths, cars, board-game expansions — waiting
list
Small repeated tuples (mods, straps, inserts)
Retro computers
Watches, board games

Every kind is one control, built once, tested once, exported once. When a proposal asks for something not on this table, the answer is "which existing kind is closest?" first, and "which second type would need it?" second.

06 · Community types under the same roof
The checklist a proposal
must pass

The proposal system is where coherence is most at risk — sixteen careful types can be undone by two hundred careless ones. The AI pass checks the mechanics; the human pass checks the taste. Both use this list, and it's shown to the proposer before they start.

MECHANICS · AI PASS
1
Has a spine: two or three fields that identify the object in a row.
2
≤14 fields, every one with a kind from the kit, ≤5 required.
3
Declares a bulk rule and a condition scale — or says "none" explicitly.
4
No personal-data fields. No field that duplicates one of the six shared.
5
Not a near-duplicate of an existing type (≥60% field overlap → suggest borrowing instead).
TASTE · HUMAN PASS
6
Is it a collected thing, or a merchant's stock category? ("Enamel pins" yes; "phone lot" no.)
7
Do the field names use the hobby's own words, spelled the way its community spells them?
8
Would a stamp collector recognise the row? (It fits the shape without a second chip line.)
9
Does it ask for a new kind? If so, name the second type that would use it — or it ships with the nearest existing kind.
10
Is the type verb, if any, genuinely singular to the hobby?
WHEN IT'S PROMOTED
It gets what official types get and nothing more: an accent from the palette, a silhouette we draw, a noun pair, one clock if it earned one. The proposer's objects migrate with every value intact, and their name goes in the release note. Types are scoped per storefront so a Brazilian merchant category never surfaces in a French collector's list.
07 · Where I'd want pushback
Four places the rules
might be too tight
Q1 · ONE TYPE VERB
Is a single type action enough for wine and computers?
Wine wants "Open a bottle"; a computer wants "Add part" and "Log a service". The rule says one. My answer: hold the line — "Log a service" is just adding a history event, which every object can already do; only Add part is a genuinely new action. The rule forces that distinction, which is the point.
Q2 · IDENTITY IN THREE PLACES
Will a cellar feel like a cellar with this little colour?
The wine community is used to burgundy everything. Paper-and-ink with a rack of rendered bottles is a bet that the object carries the atmosphere. My answer: yes, because the alternative — themed chrome per type — is exactly how sixteen apps happen. Test it with wine people first; they're the most likely to miss the colour.
Q3 · THE SECOND-CUSTOMER RULE
Does waiting for a second type slow a good first one?
yearRange shipped for wine alone because the drinking window is the type. My answer: allow one exception per type when the primitive is the reason the type exists, and log it. Rules that admit their exception get followed; rules that don't get ignored.
Q4 · TWO SIGNATURES
Do signatures reopen the door to sixteen apps?
They're the first thing on this page that lets a type look different on purpose. My answer: the budget is in the kit, not the type. Six renderers at launch, all reading existing kinds, all confined to one slot. If the renderer count ever passes ten, that's the signal it's gone wrong — not the number of types using them.
08 · Explored and declined
Should the slot order
change per type?

Worth asking, because the premise is sound: the most important fact about an object is not in the same place for every hobby. A bottle's window matters more than its label condition; a machine's working state matters more than its cosmetics. If the order were type-owned, each hobby could lead with its own truth. Three candidates, then the reason I'd still keep the order fixed.

A · FIXED ORDER · AS BUILT
1 · HERO
2 · SPINE
3 · STATUS
4 · SIGNATURE
5 · FIELDS
6 · ACTIONS
7 · HISTORY
Identical for all sixteen types. Reads as a sentence: what it is → what it's called → how it is → the proof → the detail → what you can do → what happened. A wine person who sorts records for an afternoon never re-learns a screen.
B · TYPE-OWNED ORDER
WINE
HERO
SPINE
SIGNATURE ↑
STATUS ↓
ACTIONS ↑
FIELDS
HISTORY
MACHINE
SPINE ↑
STATUS
SIGNATURE ↑
HISTORY ↑
FIELDS
ACTIONS
HERO ↓
Every type orders its own seven. Defensible per type — the wine screen genuinely reads better with the gauge above the verdict, and a machine's photo is the least useful thing on its screen.
C · FIXED ORDER, TYPE-OWNED EMPHASIS
HERO — height: tall | short | none
SPINE — 2 or 3 lines
STATUS — fixed
SIGNATURE — compact | tall
FIELDS — which 3 show first
ACTIONS — fixed
HISTORY — collapsed | open
What I'd do. Four dials, no reordering. Wine sets signature tall — the gauge takes the space a photo would, and outweighs the chip by size instead of by position. The machine sets hero short and history open. Same sentence, different stresses.
Why B loses, precisely

Not because it's wrong per type — it's right per type. It's wrong per user, and the asymmetry is the whole argument: the benefit of a better order is collected once, when you learn a type. The cost of a shifting order is paid on every screen, forever. A mixed collector flicks between a bottle and a record twenty times an evening; each flick becomes a re-read. And the app's own pitch — one place for everything — is the pitch most damaged by it.

WHAT B WOULD ACTUALLY BUY
+
One scroll saved on dense types, for the fact that type cares most about.
+
Wine's gauge above the verdict, which does read better in isolation.
+
Machines lose a hero photo that's genuinely the least informative thing on the screen.
All three are height and emphasis problems wearing an ordering costume — which is what C fixes.
WHAT IT WOULD COST
—
Muscle memory, the app's single biggest asset for a sixteen-type product.
—
The reading grammar. The order isn't decoration; it's identify → judge → verify → act. Reordering breaks the argument, not the layout.
—
Moderation. Two hundred community proposals each with their own order is unreviewable — and "order" is the field every proposer will fight over.
—
Everything downstream: share cards, the widget, PDF export, screenshots, docs, and every "where do I find…" answer becomes per-type.
—
Migration. Change type and the screen rearranges under the same object — the one moment a user most needs it not to.
Verdict: order stays fixed; emphasis becomes type-owned. A type may make a slot taller, shorter, or open — never earlier or later. If one exception ever earns itself it's swapping STATUS and SIGNATURE, which are the same question asked twice; that's one bit, not a free permutation, and I'd still want a type to prove it needs it.

Cheap way to be sure: ship A, log how often people hunt (time-to-first-scroll on the item screen, per type). If machines and bottles scroll measurably more than records, that's an argument for C's dials — it is never an argument for B.

09 · The ladder, generalised
One renderer, every
hobby's own scale

You were right that the vinyl ladder is the reusable one — and it's more reusable than it first looked. Almost every collectible has an ordered notion of condition; what differs is only the steps, the number of axes, and whether the bottom of the scale means ruined or absent. All three are already in the YAML. So the ladder takes nothing new:

ladder(scale: conditions, axes: [fields], allowMissing: bool) — steps come from the type's own conditions: list, best first. Two steps or seventy. One marker per axis. Built once.
WHAT THE YAML ALREADY GIVES IT
+
The steps. Goldmine's eight, the conservator's five, Sheldon's seventy, sealed-to-project's six. Declared once, used by the picker, the row, the CSV and the ladder.
+
The axes. Any field of kind scale becomes a marker: ● first, ◐ second, ○ third. Three is the cap — past that it's a table, not a picture.
+
Missing. allowMissing: true appends a final step. That one flag is what lets completeness and condition share a renderer — and it's the answer to the retro-game question below.
+
Numeric scales. A 1–70 or 0.1–10.0 scale buckets into seven visible steps with the exact number printed above the marker. Coins and comics get their grade, not an approximation of it.
AND THE TRIPTYCH DIES
→
You said you didn't get the retro-game signature, and the reason is that it wasn't one — three tiles showing cart, box and manual was a table pretending to be a picture.
→
It's a three-axis ladder whose last step is Missing: ● cart at NM, ◐ box at VG+, ○ manual at VG. Now it reads like the vinyl one, because it is the vinyl one.
→
The kit stays at six renderers but every one of them now has several customers. That's a better six. Switch to Retro game in section 01 to see it.
Proposals for the fifteen you listed

Two maximum, both bound to fields the type already declares, both from the kit. Where a type only earns one, it gets one — an empty second slot is not a gap.

TYPE
SIGNATURE 1
SIGNATURE 2
Action figures
ladder · figure ● and card ○ on one scale ending in Loose — MOC collectors grade both and trade on the gap between them
set · the wave: 4 of 6 filled, the two you lack greyed
Artwork
gauge · cumulative light exposure against the medium's tolerance, ESTIMATE — the one clock art actually needs
ladder · the conservator's five steps, stability not desirability
Board games
ladder · box ● and components ○, last step Incomplete — the only two facts that decide whether it can be played or sold
set · base plus expansions of the line
Books
ladder · book ● and dust jacket ○ — the exact vinyl pattern, and the second unprompted customer that proves the two-axis rule
set · volume 3 of 7 in the series
Cars
gauge · mileage toward the next service interval, ESTIMATE
panel · four lights — MOT, tax, insurance, service — from date fields, not a log
Cassettes
ladder · shell ● and inlay ○, last step No case
Candidate only — a tape-stock degradation gauge. Real for some formulations, folklore for others; needs evidence before it earns a clock
Coins
ladder · Sheldon 1–70 bucketed to seven steps, the exact grade printed above the marker · the stress test for numeric scales
set · the date run, mintmark by mintmark
Comics
ladder · CGC 0.1–10.0, with a slab outline on the marker when graded
set · the run — #1 to #50, holes visible
Compact discs
ladder · disc ●, booklet ◐, case ○ — three axes, same as the retro game
set · box set or discography completion
Lego
set · 1,204 of 1,210 parts against the official inventory, minifigs counted separately — the anxiety this hobby actually has
ladder · sealed → built → complete loose → incomplete
Motorcycles
gauge · mileage to service, ESTIMATE
panel · the same four legal lights as cars
Sneakers
ladder · DS → VNDS → used, the community's own words
gauge · midsole age against crumble risk, ESTIMATE — a genuine clock, and the reason to wear them before they're worthless
Stamps
ladder · condition ● and gum ○ (MNH → hinged → no gum), last step Faulty
set · the issue, filled or not
Trading cards
ladder · raw grade, or PSA/BGS 1–10 with the slab outline
set · base, insert and parallel completion
Watches
gauge · years since service against the caliber's interval, ESTIMATE
set · full set — watch, box, papers, links, tag — five slots, and the one that moves the price most
Which means the kit changes shape

One renderer leaves and one arrives. Triptych is gone — it was a one-customer renderer doing the ladder's job. Set arrives with eleven customers on day one, which is more than any renderer in the kit except the ladder: it renders "which of the N you have" from a series field, and it is the single most requested thing in every set-collecting hobby.

RENDERER
READS
CUSTOMERS
STANDING
ladder
scale × 1–3, allowMissing
14 types
The backbone. Build first.
set
series + setSize, or a fixed slot list
11 types
New. Earns itself on arrival.
gauge
yearRange, or a number against an interval
7 types
Already proven by wine.
panel
2–4 states, from a log or from dates
3 types
Generalised from the log to dates by cars.
map
composite
1–2 types
On the exception clause, like yearRange was.
case
consumable quantity
1 type
Exception: consumption is why wine exists.
triptych
—
0
Withdrawn. Absorbed by the ladder.

Six renderers still cover twenty types, and the two on the exception clause are the two I'd cut first if the count ever crept toward ten. Section 03's rule 2 stands: a type binds, it never paints.